package jsen.tool.ddd.adapter.infrastructure.specification.base;

import com.google.common.collect.Sets;

import java.util.Set;

/**
 * @author jsen
 * @date 2021/10/11
 */
public class SpecConfig {
    // 配置一个规格可以校验哪些字段
    private Set<String> specCanCheckFieldSet = null;

    private SpecConfig() {
    }

    private SpecConfig(Set<String> specCanCheckFieldSet) {
        this.specCanCheckFieldSet = specCanCheckFieldSet;
    }

    boolean isNeedCurrentSpec(Set<String> needSpecItem) {
        if (needSpecItem == null) {
            // 需要校验的list是null，代表不限制，所有都需要校验
            return true;
        }
        if (needSpecItem.isEmpty()) {
            // 空 list，代表一个都不需要校验
            return false;
        }
        if (specCanCheckFieldSet == null) {
            // 当前spec支持任意的SpecItem
            return true;
        }
        if (specCanCheckFieldSet.isEmpty()) {
            // 当前spec不支持任何SpecItem
            return false;
        }
        // 或者spec支持的SpecItem有任何一个属于需要校验的list里面
        return specCanCheckFieldSet.stream().anyMatch(needSpecItem::contains);
    }

    public static SpecConfig createAny() {
        return new SpecConfig();
    }

    public static SpecConfig create(String... fields) {
        Set<String> specCanCheckFieldSet = Sets.newHashSet(fields);
        return new SpecConfig(specCanCheckFieldSet);
    }

}
